#include<iostream>
#include<unistd.h>
#include<string>
#include<ctime>
#include"blockqueue.hpp"
#include"task.hpp"

using namespace std;

const int Num=3;


void * production(void * args)
{
    blockqueue<Task>*bq=static_cast<blockqueue<Task>*>(args); //类型转换

    string opers="+-*/%";

    while(true)
    {
        //1.获取原料（资料）
        int x=rand()%100+1;
        int y=rand()%100;
        char op=opers[rand()%opers.size()];

        Task t(x,y,op); //实例化
        bq->push(t);//传入对象

        cout<<pthread_self()<<"| production Task: "<<t.Print_oper()<<"#"<<endl;  

        //供应产品
        
    }
    return nullptr;  

}

void * consumer(void * args)
{
    blockqueue<Task>*bq=static_cast<blockqueue<Task>*>(args);
    while(true)
    {

        sleep(1);
        //1.确定产品是否存在
        Task t;
        bq->pop(&t);
        t();
        //2.获取产品
        cout<<pthread_self()<<" | sonsumer data: "<<t.Print_oper()<<t.Print_res()<< endl;
    }

    return nullptr;


}






int main()
{
    srand((uint64_t)time(nullptr)^getppid());

    pthread_t t1,t2,t3,t4;
    blockqueue<Task>*bq=new blockqueue<Task>();

    pthread_create(&t1,nullptr,production,bq);   //生产
    pthread_create(&t2,nullptr,production,bq);   //生产
    pthread_create(&t3 ,nullptr,consumer,bq);   //消费
    pthread_create(&t4,nullptr,consumer,bq);   //消费

    sleep(10);

    pthread_join(t1,nullptr);  //回收
    pthread_join(t2,nullptr);
    pthread_join(t3,nullptr);
    pthread_join(t4,nullptr);

    return 0;
}